Implicit conversions

From Cppreference

Jump to: navigation, search

Implicit conversions simplify processing of built-in types. These are intuitive casts that help to write less code preserving clarity of it.

Implicit casts can happen whenever a type mismatch occurs such as when calling a function or assigning a variable with slightly incompatible type. If the an implicit cast exists that can convert the source type to the destination type, that cast is performed and no error occurs. If more than one different implicit cast can be performed to match the types, the program is ill-formed because of the ambiguity. If types already match, implicit conversions are never performed.

Contents

[edit] Order of the conversions

Implicit cast consists from a series of simpler sub-conversions. The order in which they can be applied to form the final cast is as follows:

  • zero or more of generic conversions
  • zero or more of numeric conversions
  • zero or more of qualification conversions

[edit] Generic conversions

[edit] lvalue to rvalue

[edit] Array to pointer

An array variable can be converted to a pointer to its first element.

[edit] Function to pointer

An function name can automatically be converted to a pointer to that function. This does not apply to non-static member functions.

[edit] Numeric conversions

[edit] Integer promotion

When doing arithmetic operations, all small integer types are automatically converted to int or unsigned int. This is called integer promotion. This does not change the actual contents of the variable.

The following conversions may apply:

  • signed char or signed short may be casted to int.
  • unsigned char or unsigned short may be casted to unsigned int.
  • char may be casted to int or unsigned int depending on the underlying type - signed char or unsigned char (see above)
  • wchar_t or char16_t or char32_t may be casted to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long.
  • An enumeration type whose underlying type is not fixed may be casted to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, or unsigned long long. If the value range is greater, no conversions apply.
  • An enumeration type whose underlying type is fixed can be converted to its underlying type. Additionally, the resulting value can be promoted to int or unsigned int. (C++11 feature)
  • A bitfield type can be converted to int if it can represent entire value range of the bitfield, otherwise to unsigned int if it can represent entire value range of the bitfield, otherwise no conversions apply.
  • bool can be casted to int. true then becomes 1 and false - zero.

[edit] Floating point promotion

When doing floating point operations, all float objects are converted to double objects unless explicitly stated otherwise.

[edit] Floating point - integer conversions

  • Floating point numbers may be converted to integer number. The fractional part is truncated. If the value can not fit into the destination type, the behavior is undefined.
  • Integer or enumeration types may be converted to floating point types. If the value can not be represented correctly, it is implementation defined whether the higher or lower representable value will be selected. If the value can not fit into the destination type, the behavior is undefined.

[edit] Pointer conversions

  • Null pointer constant nullptr can be casted to a pointer which then holds null pointer (C++11 feature)
  • A pointer to any type can be casted to a pointer holding void. The constness of the pointed type does not change.
  • A pointer to a class type can be converted to a pointer to its base class. If the destination base class is ambiguous or inaccessible the program is ill formed. The constness of the pointed type does not change.

[edit] Boolean conversions

A integer, floating point and enumeration type can be converted to a bool type. Value of zero becomes false, any nonzero value becomes true.

A nullptr can be casted to a bool type. The resulting value is false. (C++11 feature)

[edit] Qualification conversions

For more information about cv-qualification see cv qualifiers

The following conversions are allowed:

  • unqualified type can be converted to const
  • unqualified type can be converted to volatile
  • unqualified type can be converted to const volatile
  • const type can be converted to const volatile
  • volatile type can be converted to const volatile